/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.Expressoes;

import analiseSintatica.Regras.*;
import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import AnaliseLexicaFinal.EstruturaDeDados.Token;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.estruturadados.NoArvore;
import java.util.LinkedList;

/**
 *
 * @author linton
 */
public class RegraLogicaE extends Regra{

    protected static Regra instancia;

    RegraIgualdade regraIgualdade = RegraIgualdade.getInstance();
    protected String estrutura = "<igualdade> {'&&'<igualdade>}";


    /**
     * Construtor privado necessario ao singleton
     */
    private RegraLogicaE() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraLogicaE getInstance() {
        if (instancia == null) {
            instancia = new RegraLogicaE();
        }
        return (RegraLogicaE) instancia;
    }

    

    @Override
    public NoArvore analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
        NoArvore noLogicaE = new NoArvore("<logica_e>", false);

        noLogicaE.adicionaFilho(reconhecerIgualdade(listaTokens));
        while(listaTokens.getFirst().getToken().equals("&&")) {
            noLogicaE.adicionaFilho(reconhecerAnd(listaTokens));
            noLogicaE.adicionaFilho(reconhecerIgualdade(listaTokens));
        }
        
        return noLogicaE;
    }

    public NoArvore reconhecerIgualdade (LinkedList<LinkToken> listaTokens) throws ErroSintaticoException{
        LinkToken token = listaTokens.getFirst();

        if(regraIgualdade.getPrimeiro().contains(token.getToken())){
            return regraIgualdade.analisar(listaTokens);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Falta identificador", estrutura, token.getLinha());
        throw erro;
    }

   public NoArvore reconhecerAnd(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
        LinkToken token = listaTokens.removeFirst();

        if (token.getLexema().equals("&&")) {
            return new NoArvore("operador_logico", true);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Falta operador logico", estrutura, token.getLinha());
        throw erro;
    }


    
    //@Override
  /*  public LinkedList<String> getSeguinte() {
        LinkedList<String> segundo = new LinkedList<String>();

        segundo.add("||");
        getUniao(segundo, RegraExpressao.getInstance().getSeguinte());

        return segundo;
    }*/

     @Override
    protected void setPrimeiro() {
         //P<logica_e> = P<cast>
        primeiro.add("(");
        primeiro.add("{");
        primeiro.add("identificador");
        primeiro.add("numeroInteiro");
        primeiro.add("numeroFlutuante");
        primeiro.add("charconst");
        primeiro.add("++");
        primeiro.add("--");
        primeiro.add("&");
        primeiro.add("*");
    }

    @Override
    protected void setSeguinte() {
        /*S<logica_e> = P<logica_e> U S<expressao>
            -> S<logica_e> = {'{'} U {identificador, "(", numeroInteiro , numeroFlutuante , charconst, '++', '--', '&', '*'}
                        U {";", ",", "}" ")"}*/
        this.seguinte.addAll(primeiro);
        this.seguinte.add(";");
        this.seguinte.add(",");
        this.seguinte.add("}");
        this.seguinte.add(")");
    }

   

}
